package cn.hongyu.controller;

import cn.hongyu.pojo.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Controller
public class UserController {

    //响应：1页面跳转--1返回字符串形式
    @RequestMapping("/hongyu0")
    public String goodjob(){
        System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
        return "hongyu";
    }

    /*
        Model:模型 是封装数据的
        View: 视图  是展示数据的
         */
    //响应:1页面跳转--2.1返回ModelAndView方式一
    @RequestMapping("/hongyu1")
    public ModelAndView save(){
        System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
        ModelAndView modelAndView = new ModelAndView();//此时是空的
        //设置视图 此时已经设置好后缀了
        modelAndView.setViewName("hongyu");
        //设置模型 此时模型(键值对)已经在域中了，可以再页面用el表达式获取
        modelAndView.addObject("username","hongyu");
        return modelAndView;
    }
    //响应:1页面跳转--2.2返回ModelAndView方式二(参数spring检测到ModelAndView会自动注入)
    @RequestMapping("/hongyu2")
    public ModelAndView save1(ModelAndView modelAndView){
        System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
        modelAndView.setViewName("hongyu");
        modelAndView.addObject("username","hongyu方式二");
        return modelAndView;
    }
    //响应:1页面跳转--2.3返回ModelAndView方式三
    @RequestMapping("/hongyu3")
    public String save2(Model model){
        System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
        model.addAttribute("username", "金刚葫芦娃");
        return "hongyu";
    }
    //响应:1页面跳转--2.4返回ModelAndView方式四 采用request对象(不常用)
    @RequestMapping("/hongyu4")
    public String save3(HttpServletRequest request){
        System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
        request.setAttribute("username", "不干了");
        return "hongyu";
    }
    //响应:2回写数据--1直接返回字符串
    @RequestMapping("/hongyu5")
    public void save4(HttpServletResponse response) throws IOException {
        //回写到页面
        response.getWriter().println("你好啊");
    }
    //响应:2回写数据--2直接返回字符串
    // (此时要加注解@ResponseBody与页面跳转区分)
    @RequestMapping("/hongyu6")
    @ResponseBody
    public String save5(){
        //回写到页面
        System.out.println("hhhhhh");
        return "hello zhazhahui";
    }
    //响应:2回写数据--3直接返回Json格式字符串
    //直接写太low 不建议
    @RequestMapping("/hongyu7")
    @ResponseBody
    public String save6(HttpServletResponse response)  {
        //回写到页面
        return ("{username"+":"+"zhangfei}");
    }
    //响应:2回写数据--4直接返回Json格式字符串
    @RequestMapping("/hongyu8")
    @ResponseBody
    public String save7(HttpServletResponse response) throws IOException {
        //回写到页面
        User user = new User();
        user.setUsername("zhazhahui");
        user.setAge(88);
        //使用Json转换工具将对象转换为json字符串//要到包
        ObjectMapper objectMapper=new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);
        return json;
    }
    //响应:2回写数据--返回对象或集合
    //期望mvc将user转换为json格式字符串--(要配置)
    //当然@ResponseBody也要写上
    @RequestMapping("/hongyu9")
    @ResponseBody
    public User save8(HttpServletResponse response) {
        //回写到页面
        User user = new User();
        user.setUsername("zhazhahui");
        user.setAge(99);
        return user;
    }
    //响应:2回写数据--返回对象或集合
    //期望mvc将user转换为json格式字符串--(要配置)
    //当然@ResponseBody也要写上
    @RequestMapping("/hongyu10")
    @ResponseBody
    public List<User> save9(HttpServletResponse response) {
        //回写到页面
        User user1 = new User();
        user1.setUsername("wanglaowu");
        user1.setAge(99);
        User user2 = new User();
        user2.setUsername("zhanglaosan");
        user2.setAge(66);
        ArrayList<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        return users;
    }

    //但是以上返回对象或集合的json格式配置（处理器映射器）太长可以使用mvc注解驱动代替
    //<mvc:annotation-driven/>(mvc注解驱动),同时该注解不仅能代替处理器映射器
    //还能代替处理器适配器与处理器解析器相当的好用
}
